package org.sentinel.server.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("sentinel")
public class SentinelController {

	/**
	 * 启动控制台:
	 * java -Dserver.port=8074 -Dcsp.sentinel.dashboard.server=localhost:8074 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.1.jar 
	 * 其中 -Dserver.port=8074 用于指定 Sentinel 控制台端口为 8074
	 * 启动时加入 JVM 参数 -Dcsp.sentinel.dashboard.server=consoleIp:port 指定控制台地址和端口
	 * 若启动多个应用，则需要通过 -Dcsp.sentinel.api.port=xxxx 指定客户端监控 API 的端口（默认是 8719）
	 * 若 jdk 版本不对应启动失败，更改启动命令，打开特定的包装进行反射: --add-opens java.base/java.lang=ALL-UNNAMED 
	 */

	/**
	 * 持久化: 
	 *   原始模式: API 将规则推送至客户端并直接更新到内存中，扩展写数据源（WritableDataSource）
	 *     优点: 简单，无任何依赖
	 *     缺点: 不保证一致性；规则保存在内存中，重启即消失。严重不建议用于生产环境
	 *   Pull 模式: 扩展写数据源（WritableDataSource）， 客户端主动向某个规则管理中心定期轮询拉取规则，这个规则中心可以是 RDBMS、文件、Consul, Eureka 等 
	 *     优点: 简单，无任何依赖；规则持久化
	 *     缺点: 不保证一致性；实时性不保证，拉取过于频繁也可能会有性能问题
	 *   Push 模式: 扩展读数据源（ReadableDataSource），规则中心统一推送，客户端通过注册监听器的方式时刻监听变化，比如使用 ZooKeeper, Redis, Nacos, Apollo, etcd 等。
	 * 这种方式有更好的实时性和一致性保证。生产环境下一般采用 push 模式的数据源
	 *     优点: 规则持久化；一致性；快速
	 *     缺点: 引入第三方依赖
	 *  Nacos 实现持久化: 
	 *    通过控制台设置规则后将规则推送到统一的规则中心，客户端实现 ReadableDataSource 接口端监听规则中心实时获取变更;但 Sentinel 的操作并不能同步到 Nacos 
	 */

	private static Logger logger = LoggerFactory.getLogger(SentinelController.class);

	@GetMapping("/testA")
    public String sentinelTestA(){
		logger.info("testA");
        return "testA";
    }

    @GetMapping("/testB")
    public String sentinelTestB(){
    	logger.info("testB");
        return "testB";
    }

}
